home *** CD-ROM | disk | FTP | other *** search
/ Software of the Month Club 2000 October / Software of the Month - Ultimate Collection Shareware 277.iso / pc / PROGRAMS / UTILITY / WINLINUX / DATA1.CAB / programs_-_usrdoc / SVGALIB-.{2E / SUPPORT / VGA.C < prev   
C/C++ Source or Header  |  1999-09-17  |  4KB  |  147 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dos.h>
  4.  
  5. /* January 1995, Scott Heavner (sdh@po.cwru.edu)
  6.  
  7.  * Changes to allow anyone to compile vga.c under the go32 Linux->dos cross compiler.
  8.  * It should also work with DJGPP (the gcc port to msdos).  The cross compiler is
  9.  * available at ftp://sunsite.unc.edu/pub/Linux/devel/msdos/go32crs.tar.gz.
  10.  * 
  11.  * I compiled it with:
  12.  *
  13.  *      go32gcc vga.c -lpc
  14.  *      cat /usr/local/go32/bin/go32.exe a.out > vga.exe 
  15.  */
  16. #ifdef GO32
  17. #include <pc.h>
  18. #endif
  19.  
  20. /* VGA index register ports */
  21. #define CRT_I   0x3D4        /* CRT Controller Index (mono: 0x3B4) */
  22. #define ATT_IW  0x3C0        /* Attribute Controller Index & Data Write Register */
  23. #define GRA_I   0x3CE        /* Graphics Controller Index */
  24. #define SEQ_I   0x3C4        /* Sequencer Index */
  25. #define PEL_IW  0x3C8        /* PEL Write Index */
  26.  
  27. /* VGA data register ports */
  28. #define CRT_D   0x3D5        /* CRT Controller Data Register (mono: 0x3B5) */
  29. #define ATT_R   0x3C1        /* Attribute Controller Data Read Register */
  30. #define GRA_D   0x3CF        /* Graphics Controller Data Register */
  31. #define SEQ_D   0x3C5        /* Sequencer Data Register */
  32. #define MIS_R   0x3CC        /* Misc Output Read Register */
  33. #define MIS_W   0x3C2        /* Misc Output Write Register */
  34. #define IS1_R   0x3DA        /* Input Status Register 1 (mono: 0x3BA) */
  35. #define PEL_D   0x3C9        /* PEL Data Register */
  36.  
  37. /* VGA indexes max counts */
  38. #define CRT_C   24        /* 24 CRT Controller Registers */
  39. #define ATT_C   21        /* 21 Attribute Controller Registers */
  40. #define GRA_C   9        /* 9  Graphics Controller Registers */
  41. #define SEQ_C   5        /* 5  Sequencer Registers */
  42. #define MIS_C   1        /* 1  Misc Output Register */
  43.  
  44. /* VGA registers saving indexes */
  45. #define CRT     0        /* CRT Controller Registers start */
  46. #define ATT     CRT+CRT_C    /* Attribute Controller Registers start */
  47. #define GRA     ATT+ATT_C    /* Graphics Controller Registers start */
  48. #define SEQ     GRA+GRA_C    /* Sequencer Registers */
  49. #define MIS     SEQ+SEQ_C    /* General Registers */
  50. #define END     MIS+MIS_C    /* last */
  51.  
  52.  
  53. unsigned char vga_regs[60];
  54.  
  55. #ifdef GO32
  56.  
  57. #define port_out(v,p) outportb(p,v)
  58. #define port_in(p) inportb(p)
  59.  
  60. #else
  61.  
  62. void port_out(unsigned char value, unsigned short port)
  63. {
  64.     asm
  65.     {
  66.     mov dx, port
  67.      mov al, value
  68.      out dx, al
  69.     }
  70. } unsigned char port_in(unsigned short port)
  71. {
  72.     asm
  73.     {
  74.     mov dx, port
  75.      in al, dx
  76.     } return (_AL);
  77. }
  78.  
  79. #endif
  80.  
  81. main(int argc, char *argv[])
  82. {
  83.     union REGS cpu_regs;
  84.     int i;
  85.     unsigned char mode;
  86.  
  87.     if (argc != 2) {
  88.     printf("Usage: getregs mode (mode must be hexadecimal)\n");
  89.     exit(-1);
  90.     }
  91.     if (!sscanf(argv[1], "%x", &mode)) {
  92.     printf("Usage: getregs mode (mode must be hexadecimal)\n");
  93.     exit(-1);
  94.     }
  95.     cpu_regs.h.ah = 0x00;
  96.     cpu_regs.h.al = mode;
  97.     int86(0x10, &cpu_regs, &cpu_regs);
  98.  
  99.     /* get VGA register values */
  100.     for (i = 0; i < CRT_C; i++) {
  101.     port_out(i, CRT_I);
  102.     vga_regs[CRT + i] = port_in(CRT_D);
  103.     }
  104.     for (i = 0; i < ATT_C; i++) {
  105.     port_in(IS1_R);
  106.     port_out(i, ATT_IW);
  107.     vga_regs[ATT + i] = port_in(ATT_R);
  108.     }
  109.     for (i = 0; i < GRA_C; i++) {
  110.     port_out(i, GRA_I);
  111.     vga_regs[GRA + i] = port_in(GRA_D);
  112.     }
  113.     for (i = 0; i < SEQ_C; i++) {
  114.     port_out(i, SEQ_I);
  115.     vga_regs[SEQ + i] = port_in(SEQ_D);
  116.     }
  117.     vga_regs[MIS] = port_in(MIS_R);
  118.  
  119.     cpu_regs.h.ah = 0x00;
  120.     cpu_regs.h.al = 0x03;
  121.     int86(0x10, &cpu_regs, &cpu_regs);
  122.  
  123.     printf("/* BIOS mode 0x%02X */\n", mode);
  124.     printf("static char regs[60] = {\n  ");
  125.     for (i = 0; i < 12; i++)
  126.     printf("0x%02X,", vga_regs[CRT + i]);
  127.     printf("\n  ");
  128.     for (i = 12; i < CRT_C; i++)
  129.     printf("0x%02X,", vga_regs[CRT + i]);
  130.     printf("\n  ");
  131.     for (i = 0; i < 12; i++)
  132.     printf("0x%02X,", vga_regs[ATT + i]);
  133.     printf("\n  ");
  134.     for (i = 12; i < ATT_C; i++)
  135.     printf("0x%02X,", vga_regs[ATT + i]);
  136.     printf("\n  ");
  137.     for (i = 0; i < GRA_C; i++)
  138.     printf("0x%02X,", vga_regs[GRA + i]);
  139.     printf("\n  ");
  140.     for (i = 0; i < SEQ_C; i++)
  141.     printf("0x%02X,", vga_regs[SEQ + i]);
  142.     printf("\n  ");
  143.     printf("0x%02X", vga_regs[MIS]);
  144.     printf("\n};\n");
  145.  
  146. }
  147.